/*
 * 本类作用：程序界面初始化（上一步：程序入口DataReceivePro，下一步：mina框架开始启动StartServer）
 * 
 * 作者：袁小杰
 * 博客：http://blog.csdn.net/undoner
 * GIT：https://git.oschina.net/undoner
 * QQ：15137281
 * 
 */
package org.mina.mainFrame;

import java.awt.Color;
import java.awt.SystemColor;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;

import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.LayoutStyle.ComponentPlacement;
import javax.swing.SwingConstants;
import javax.swing.border.EmptyBorder;

import org.mina.server.StartServer;
import org.mina.util.ComCheck;
import org.mina.util.ConfigProperties;

@SuppressWarnings("serial")
public class DataReceiveFrame extends JFrame {

	/** 监听端口号 */
	private static int LocalPort = 3366;
	/** 窗口图标显示的图像位置 */
	private static String LOGO_URL = "/com/sun/java/swing/plaf/windows/icons/Computer.gif";
	/** 窗口标题 */
	private static String FRAME_TITLE = "数据采集服务器";
	/** 窗口横坐标位置 */
	private static int Frame_XPOINT = 100;
	/** 窗口纵坐标位置 */
	private static int Frame_YPOINT = 100;
	/** 窗口宽度 */
	private static int Frame_WIDTH = 645;
	/** 窗口高度 */
	private static int Frame_HEIGT = 515;
	/** 窗口上边框size */
	private static int Frame_TOP_SIZE = 1;
	/** 窗口下边框size */
	private static int Frame_BOTTOM_SIZE = 5;
	/** 窗口左边框size */
	private static int Frame_LEFT_SIZE = 0;
	/** 窗口右边框size */
	private static int Frame_RIGHT_SIZE = 2;
	/** 窗口功能区宽度 */
	private static int Frame_BUTTON_PANE_WIDTH = 100;
	/** 窗口功能区高度 */
	private static int Frame_BUTTON_PANE_HEIGHT = 457;
	/** 窗口显示区宽度 */
	private static int Frame_LOGVIEW_PANE_WIDTH = 503;
	/** 窗口显示区高度 */
	private static int Frame_LOGVIEW_PANE_HEIGHT = 457;

	/** 端口入力框控件提示消息 */
	private static String PORT_TOOLTIP_MSG = "请输入端口号";
	/** 日志显示域控件提示消息 */
	private static String LOGVIEW_TOOLTIP_MSG = "日志显示";
	/** 接收数据按钮名称 */
	private static String START_BUTTON_NM = "接收数据";
	/** 停止接收按钮名称 */
	private static String STOP_BUTTON_NM = "停止接收";
	/** 查看日志按钮名称 */
	private static String LOGVIEW_BUTTON_NM = "查看日志";

	/** 窗口布局对象 */
	private JPanel contentPane = null;
	/** 端口号 */
	public JTextField portTextField = null;
	/** 采集日志显示区 */
	public static JTextArea logViewTextArea = null;
	/** 数据接收按钮 */
	private JButton btn_start = null;
	/** 停止接收按钮 */
	private JButton btn_stop = null;
	/** 查看日志按钮 */
	private JButton btn_viewlog = null;
	/** 业务类对象初期化 */
	
	DataReceiveFrame() {
		super();
	}

	/**
	 * 数据采集平台界面初期化
	 * 
	 * @return void
	 */
	public void frameInit(DataReceiveFrame frame) {
		
		//初始化窗口属性
		configFrame();
		
		// 设置要作为此窗口图标显示的图像
		setIconImage(Toolkit.getDefaultToolkit().getImage(
				DataReceivePro.class.getResource(LOGO_URL)));
		// 设置窗口标题
		setTitle(FRAME_TITLE);
		// 设置窗口默认关闭按钮
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		// 设置窗体位置及大小
		setBounds(Frame_XPOINT, Frame_YPOINT, Frame_WIDTH, Frame_HEIGT);

		// 界面布局初期化
		contentPane = new JPanel();
		// 设置窗体边框size
		contentPane.setBorder(new EmptyBorder(Frame_TOP_SIZE, Frame_LEFT_SIZE,
				Frame_BOTTOM_SIZE, Frame_RIGHT_SIZE));
		// 界面布局实装
		setContentPane(contentPane);

		// 界面布局
		JPanel panel = new JPanel();
		// 设置此组件的背景色。(高亮)
		panel.setBackground(SystemColor.textHighlight);
		// 滚动条控件初期化
		JScrollPane scrollPane = new JScrollPane();
		// 界面模板初期化
		GroupLayout gl_contentPane = new GroupLayout(contentPane);
		// 界面布局纵向布局
		gl_contentPane.setHorizontalGroup(gl_contentPane.createParallelGroup(
				Alignment.TRAILING).addGroup(
						Alignment.LEADING,
						gl_contentPane
						.createSequentialGroup()
						.addContainerGap()
						.addComponent(panel, GroupLayout.PREFERRED_SIZE,
								Frame_BUTTON_PANE_WIDTH,
								GroupLayout.PREFERRED_SIZE)
								.addPreferredGap(ComponentPlacement.RELATED)
								.addComponent(scrollPane, GroupLayout.DEFAULT_SIZE,
										Frame_LOGVIEW_PANE_WIDTH, Short.MAX_VALUE)));
		// 界面布局横向布局
		gl_contentPane.setVerticalGroup(gl_contentPane.createParallelGroup(
				Alignment.LEADING).addGroup(
						gl_contentPane
						.createSequentialGroup()
						.addContainerGap()
						.addGroup(
								gl_contentPane
								.createParallelGroup(Alignment.LEADING)
								.addComponent(scrollPane,
										Alignment.TRAILING,
										GroupLayout.DEFAULT_SIZE,
										Frame_LOGVIEW_PANE_HEIGHT,
										Short.MAX_VALUE)
										.addComponent(panel,
												GroupLayout.DEFAULT_SIZE,
												Frame_BUTTON_PANE_HEIGHT,
												Short.MAX_VALUE))));
		// 端口号控件实装
		portTextField = new JTextField();
		// 端口内容居中
		portTextField.setHorizontalAlignment(SwingConstants.CENTER);
		// 端口框背景色（蓝绿色）
		portTextField.setBackground(Color.CYAN);
		// 端口框提示信息
		portTextField.setToolTipText(PORT_TOOLTIP_MSG);
		// 端口内容长度
		portTextField.setColumns(8);
		// 默认端口号读取
		portTextField.setText(String.valueOf(LocalPort));
		// 添加端口框到面板
		panel.add(portTextField);

		// 日志显示域控件实装
		logViewTextArea = new JTextArea();
		// 日志显示域提示信息
		logViewTextArea.setToolTipText(LOGVIEW_TOOLTIP_MSG);
		// scroll追加
		scrollPane.setViewportView(logViewTextArea);

		// 接收数据按钮实装
		btn_start = new JButton(START_BUTTON_NM);
		// 接收数据按钮事件添加
		btn_start.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				// 接收数据按钮按下的场合
				if (btn_start.isEnabled()) {
					// 接收事件
					recClick();
				}
			}
		});
		panel.add(btn_start);


		// 查看日志按钮实装
		btn_viewlog = new JButton(LOGVIEW_BUTTON_NM);
		// 查看日志按钮事件添加
		btn_viewlog.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				// 查看日志按钮按下的场合
				if (btn_viewlog.isEnabled()) {
					try {
						// 打开日志目录
						String url = System.getProperty("user.dir") + File.separator + "log";
						java.awt.Desktop.getDesktop().open(new File(url));
					} catch (Exception ex) {
						// textArea.append("\n"+ex.getMessage());
						// outinfo.print("btn_viewlog_mouseClicked():"+ex.getMessage(),2);s
					}
				}
			}
		});
		panel.add(btn_viewlog);

		// 画面布局装载
		contentPane.setLayout(gl_contentPane);
		// 设为可见
		setVisible(true);
	}

	/**
	 * 接收数据按钮click事件
	 * 
	 * @return void
	 */
	private void configFrame() {
		//读取配置文件config.properties中的属性值
		String myFilePath= System.getProperty("user.dir") + File.separator + "config" + File.separator + "FrameConfig.properties";
		ConfigProperties pro = new ConfigProperties(myFilePath);
		//若无法读取文件内容，则使用模式值
		if(!pro.getValue("LocalPort").trim().equals(""))
		{
			/** 监听端口号 */
			LocalPort = Integer.parseInt((String) pro.getValue("LocalPort"));
			/** 窗口标题 */
			FRAME_TITLE = (String) pro.getValue("FRAME_TITLE");
			/** 窗口图标显示的图像位置 */
			LOGO_URL = (String) pro.getValue("LOGO_URL");
			/** 窗口横坐标位置 */
			Frame_XPOINT = Integer.parseInt((String) pro.getValue("Frame_XPOINT"));
			/** 窗口纵坐标位置 */
			Frame_YPOINT = Integer.parseInt((String) pro.getValue("Frame_YPOINT"));
			/** 窗口宽度 */
			Frame_WIDTH = Integer.parseInt((String) pro.getValue("Frame_WIDTH"));
			/** 窗口高度 */
			Frame_HEIGT = Integer.parseInt((String) pro.getValue("Frame_HEIGT"));
			/** 窗口上边框size */
			Frame_TOP_SIZE = Integer.parseInt((String) pro.getValue("Frame_TOP_SIZE"));
			/** 窗口下边框size */
			Frame_BOTTOM_SIZE = Integer.parseInt((String) pro.getValue("Frame_BOTTOM_SIZE"));
			/** 窗口左边框size */
			Frame_LEFT_SIZE = Integer.parseInt((String) pro.getValue("Frame_LEFT_SIZE"));
			/** 窗口右边框size */
			Frame_RIGHT_SIZE = Integer.parseInt((String) pro.getValue("Frame_RIGHT_SIZE"));
			/** 窗口功能区宽度 */
			Frame_BUTTON_PANE_WIDTH = Integer.parseInt((String) pro.getValue("Frame_BUTTON_PANE_WIDTH"));
			/** 窗口功能区高度 */
			Frame_BUTTON_PANE_HEIGHT = Integer.parseInt((String) pro.getValue("Frame_BUTTON_PANE_HEIGHT"));
			/** 窗口显示区宽度 */
			Frame_LOGVIEW_PANE_WIDTH = Integer.parseInt((String) pro.getValue("Frame_LOGVIEW_PANE_WIDTH"));
			/** 窗口显示区高度 */
			Frame_LOGVIEW_PANE_HEIGHT = Integer.parseInt((String) pro.getValue("Frame_LOGVIEW_PANE_HEIGHT"));

			/** 端口入力框控件提示消息 */
			PORT_TOOLTIP_MSG = (String) pro.getValue("PORT_TOOLTIP_MSG");
			/** 日志显示域控件提示消息 */
			LOGVIEW_TOOLTIP_MSG = (String) pro.getValue("LOGVIEW_TOOLTIP_MSG");
			/** 接收数据按钮名称 */
			START_BUTTON_NM = (String) pro.getValue("START_BUTTON_NM");
			/** 停止接收按钮名称 */
			STOP_BUTTON_NM = (String) pro.getValue("STOP_BUTTON_NM");
			/** 查看日志按钮名称 */
			LOGVIEW_BUTTON_NM = (String) pro.getValue("LOGVIEW_BUTTON_NM");
		}
		
	}

	/**
	 * 接收数据按钮click事件
	 * 
	 * @return void
	 */
	private void recClick() {

		// 端口号取得
		String localport = portTextField.getText();

		// 端口号合法性check及按钮制御
		portChk(localport);

		// 业务逻辑处理
		StartServer ss = new StartServer();
		try {
			ss.start(localport);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * 用于程序界面显示区域输出
	 * 
	 * @return void
	 */
	public static void setTextArea(String info) {
		if (logViewTextArea.getLineCount() > 10000) {
			logViewTextArea.setText("");
			logViewTextArea.append("\n" + "屏幕日志超过1万条,内容过多将自动进行清屏！历史数据请查看文件.");
			
		}
		logViewTextArea.append("\n" + info);
	}


	/**
	 * 端口号合法性check及按钮制御
	 */
	public void portChk(String localport) {

		// 端口号必须入力check
		if (localport == null || localport.equals("")) {
			// 错误MSG提示及背景色强调
			portTextField.setText("请输入端口号");
			portTextField.setBackground(Color.YELLOW);
			portTextField.getFocusAccelerator();

			btn_start.setEnabled(true);
			btn_stop.setEnabled(false);
		} else if (!ComCheck.isNum(localport)) { // 端口号数字型check
			// 错误MSG提示及背景色强调
			portTextField.setText("端口号只能为数字");
			portTextField.setBackground(Color.YELLOW);
			portTextField.getFocusAccelerator();
			// 按钮制御
			btn_start.setEnabled(true);
			btn_stop.setEnabled(false);
		} else if (Integer.parseInt(localport) < 0
				|| Integer.parseInt(localport) > 65535) { // 端口号有效性check
			// 错误MSG提示及背景色强调
			portTextField.setText("端口范围0~65535的数字");
			portTextField.setBackground(Color.YELLOW);
			portTextField.getFocusAccelerator();
			// 按钮制御
			btn_start.setEnabled(true);
			btn_stop.setEnabled(false);
		}

		// 端口背景色强调及关联控件制御
		portTextField.setBackground(Color.CYAN);
		portTextField.setToolTipText("");
		portTextField.setEnabled(false);
		btn_start.setEnabled(false);
	}
}
